
    <!DOCTYPE html>
    <html lang="zh-CN">
    <head>
      <meta charset="UTF-8">
      <meta name="viewport" content="width=device-width, initial-scale=1.0">
      <title>InnoDB和MyISAM有什么区别？ - 学习卡片</title>
      <style>
        body { font-family: sans-serif; background-color: #f0f8ff; color: #333; display: flex; flex-direction: column; align-items: center; padding: 50px 20px; }
        .header h1 { font-size: 32px; }
        .grid-container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 28px; width: 100%; max-width: 1200px; }
        .card-container { perspective: 1200px; cursor: pointer; height: 250px; }
        .card { width: 100%; height: 100%; position: relative; transform-style: preserve-3d; transition: transform 0.7s; border-radius: 16px; box-shadow: 0 4px 16px rgba(0,0,0,0.08); }
        .card-container.flipped .card { transform: rotateY(180deg); }
        .card-face { position: absolute; width: 100%; height: 100%; backface-visibility: hidden; display: flex; flex-direction: column; box-sizing: border-box; border-radius: 16px; background-color: #fff; padding: 24px; }
        .card-back { background-color: #f0fff4; transform: rotateY(180deg); justify-content: space-between; }
        .card-category { font-size: 14px; color: #0052d9; margin-bottom: 8px; font-weight: 500; }
        .card-question { font-size: 20px; font-weight: 500; flex-grow: 1; display: flex; align-items: center; justify-content: center; text-align: center; }
        .card-answer-wrapper { flex-grow: 1; overflow-y: auto; }
        .card-answer { font-size: 15px; line-height: 1.7; }
        .card-footer { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 16px; margin-top: 16px; }
        .card-source { font-size: 13px; color: #8a919f; border-top: 1px solid #f0f0f0; padding-top: 12px; margin-top: 12px; }
      </style>
    </head>
    <body>
      <div class="header">
        <h1>InnoDB和MyISAM有什么区别？ - 学习卡片</h1>
      </div>
      <div class="grid-container">
        
    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">在事务处理方面，InnoDB和MyISAM最核心的区别是什么？这对数据完整性有何影响？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">InnoDB支持事务，并遵循ACID（原子性、一致性、隔离性、持久性）属性，这能确保数据的一致性和完整性。相比之下，MyISAM是一个非事务性的存储引擎，不具备ACID属性，每个SQL语句都被视为一个独立事务，无法回滚，这可能导致数据库在多步操作失败时处于不一致的状态。</div>
          </div>
          <div class="card-source">来源: 事务支持</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">InnoDB和MyISAM的锁定机制有何不同？这种差异如何影响数据库的并发性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">InnoDB使用行级锁，在数据操作时只锁定受影响的行，这使得多个事务可以并发地修改同一张表中的不同行，从而提高了并发性能并减少了死锁的发生。而MyISAM使用表级锁，在进行读写操作时会锁定整个表，这可能导致并发性能下降，特别是在高并发的写操作场景下。</div>
          </div>
          <div class="card-source">来源: 行级锁和表级锁</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">在维护数据引用完整性方面，InnoDB和MyISAM提供了哪些不同的支持？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">InnoDB支持外键约束，这可以在数据库层面强制执行数据间的引用完整性，确保一个表中引用的数据在另一个相关表中存在。而MyISAM不支持外键约束，这意味着数据完整性的维护需要由应用层面来负责。</div>
          </div>
          <div class="card-source">来源: 外键约束</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">根据文档描述，InnoDB和MyISAM分别最适合哪些类型的应用场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">InnoDB通常用于要求事务支持、数据完整性和高并发能力的应用，例如在线交易系统、金融系统、ERP系统等。而MyISAM适用于读取性能要求较高、且不需要事务支持和数据完整性约束的应用，例如博客、新闻网站、日志系统等。</div>
          </div>
          <div class="card-source">来源: 适用场景</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">机制</div>
          <div class="card-question">InnoDB和MyISAM在缓存数据和索引的机制上有何不同？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">机制</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">InnoDB使用一个称为“缓冲池（buffer pool）”的专用内存区域来缓存数据和索引，以减少磁盘I/O操作。而MyISAM则依赖于操作系统的文件缓存来缓存数据，这在高并发情况下可能导致缓存争用和性能下降。</div>
          </div>
          <div class="card-source">来源: 空间占用和缓存机制</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">当数据库发生崩溃时，InnoDB相较于MyISAM在数据恢复方面有何优势？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">InnoDB具有更好的崩溃恢复能力。它使用事务日志（redo log）来记录事务操作，支持在数据库崩溃或意外断电后，可靠地将数据恢复到事务提交时的状态。MyISAM的崩溃恢复能力相对较弱，因为它没有类似的事务日志机制，可能导致数据丢失或损坏。</div>
          </div>
          <div class="card-source">来源: 性能特征</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">特性</div>
          <div class="card-question">MyISAM支持哪项InnoDB早期版本不具备的重要功能，该功能适用于什么场景？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">特性</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyISAM支持全文索引（full-text index），这项功能可以在文本数据上进行高效的全文搜索，非常适用于博客、论坛等需要对大量文本内容进行搜索的应用。</div>
          </div>
          <div class="card-source">来源: 存储引擎特有的功能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">技术</div>
          <div class="card-question">从磁盘上的文件存储结构来看，InnoDB和MyISAM有何区别？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">技术</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">MyISAM将每张表的数据和索引分开存储在不同的文件中，通常是.frm（表结构）、.MYD（数据）和.MYI（索引）三个文件。而InnoDB通常将同一个表的数据和索引都集中存储在同一个数据文件中（.ibd文件）。</div>
          </div>
          <div class="card-source">来源: 存储引擎特有的功能</div>
        </div>
      </div>
    </div>

    <div class="card-container" onclick="this.classList.toggle('flipped');">
      <div class="card">
        <div class="card-face card-front">
          <div class="card-category">模式</div>
          <div class="card-question">针对读密集型和写密集型应用，通常应如何选择InnoDB和MyISAM以获得更优性能？</div>
          <div class="card-footer">点击卡片查看答案</div>
        </div>
        <div class="card-face card-back">
          <div class="card-category">模式</div>
          <div class="card-answer-wrapper">
            <div class="card-answer">对于读密集型应用，MyISAM可能性能更好，因为它不需要维护事务和行级锁。而对于写密集型或需要事务支持的应用，InnoDB通常是更合适的选择，因为它通过行级锁提供了更好的并发性能和数据一致性保证。</div>
          </div>
          <div class="card-source">来源: 性能特征</div>
        </div>
      </div>
    </div>

      </div>
    </body>
    </html>
